package com.kgc.smbms.controller;

import com.alibaba.fastjson.JSON;
import com.kgc.smbms.bean.Role;
import com.kgc.smbms.bean.User;
import com.kgc.smbms.service.RoleService;
import com.kgc.smbms.service.UserService;
import com.kgc.smbms.utils.PageSupport;
import com.kgc.smbms.utils.Sendmail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created On : 11/8/2022.
 * <p>
 * Author : huayu
 * <p>
 * Description: UserServlet  用户  控制层  servlet
 */
@Controller
@RequestMapping("/user")
public class UserController{

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;


    //用户登录
    @RequestMapping("/login")
    public String login(HttpServletRequest req,
                          Map<String,Object> map,
                          @RequestParam("userCode") String userCode,
                          @RequestParam("userPassword") String userPassword){
        System.out.println("=============用户登录=====================");

        //调用业务层判断用用户信息是否正确
        User user = userService.checkLoginUser(userCode,userPassword);

        System.out.println("登录用户："+userCode+"登录用户密码："+userPassword);

        if(user != null){
            //登录成功
            req.getSession().setAttribute("loginUser",user);
//            map.put("loginUser",user);

            //直接重定向到管理主页
            return "frame";
        }else{
            //登录失败  返回数据 error
            map.put("error","用户或者密码错误");

            System.out.println("登录失败！！！");

            return "forward:/login.jsp";
        }

    }

    //用户退出
    @RequestMapping("/userLogOut")
    public String userLogOut(HttpServletRequest req)  {
        System.out.println("=============用户退出=====================");
        req.getSession().removeAttribute("loginUser");

        //重定向
        return "redirect:/login.jsp";

    }

    // 分页 条件查询用户列表
    @RequestMapping("/userList")
    public String userList(HttpServletRequest req,
                           Map<String,Object> map,
                           @RequestParam(value = "queryName",required = false) String queryName,
                           @RequestParam(value = "queryUserRole",required = false,defaultValue = "0") String queryUserRole,
                           @RequestParam(value = "pageNo",required = false,defaultValue = "1") String pageNo,
                           @RequestParam(value = "pageSize",required = false,defaultValue = "5") String pageSize,
                           @RequestParam(value = "orderBy",required = false,defaultValue = "id") String orderBy,
                           @RequestParam(value = "ascOrDesc",required = false,defaultValue = "asc") String ascOrDesc) {

        System.out.println("=============条件 分页 查询用户列表=====================");
        //根据条件查询获取用户 总数
        int totalCount = userService.getUserListTotalByQueryNameAndQueryUserRole(queryName,Integer.parseInt(queryUserRole));

        //创建分页对象
        PageSupport<List<User>> pageSupport = new PageSupport<List<User>>();
        pageSupport.setPageSize(Integer.parseInt(pageSize));
        pageSupport.setTotalCount(totalCount);

        //创建回显数据
        List callBackInfo = new ArrayList();
        //pageSupport 中放入回显数据
        //查询条件
        callBackInfo.add(queryName);
        callBackInfo.add(queryUserRole);
        pageSupport.setCallBackInfo(callBackInfo);
        //当前页码
        pageSupport.setCurrPageNo(Integer.parseInt(pageNo));
        //页面容量
        pageSupport.setPageSize(Integer.parseInt(pageSize));
        //排序条件
        pageSupport.setOrderBy(orderBy);
        //排序  方式 asc  desc
        pageSupport.setAscOrDesc(ascOrDesc);


        //查询所有的用户详情列表
        List<User> userList = userService.getUserListByQueryNameAndQueryUserRole(queryName,Integer.parseInt(queryUserRole),pageSupport);
        System.out.println("=============条件 分页 查询用户列表 参数=============");
        System.out.println("查询参数==》queryName = " + queryName);
        System.out.println("查询参数==》queryUserRole = " + queryUserRole);
        System.out.println("排序参数==》orderBy = " + orderBy);
        System.out.println("排序参数==》ascOrDesc = " + ascOrDesc);
        System.out.println("分页参数==》pageNo = " + pageNo);
        System.out.println("分页参数==》pageSize = " + pageSize);
        System.out.println(JSON.toJSONStringWithDateFormat(userList,"yyyy-MM-dd"));

        //将数据放入分页对象中
        pageSupport.setData(userList);

        //将分页对象放进request域中
        map.put("pageSupport",pageSupport);

        //查询所有的  用户角色
        List<Role> roleList = roleService.findRoleList();
        System.out.println("=============查询所有的用户角色===============");
        System.out.println(JSON.toJSONStringWithDateFormat(roleList,"yyyy-MM-dd"));
        //将roleList 放进session域中，方便其他的地方直接调用，不用再次查询
        req.getSession().setAttribute("roleList",roleList);

        //内部转发到用户列表页面
        return "userlist";

    }

    //查看用户详情
    @RequestMapping("/userInfo")
    public String userInfo(Map<String,Object> map,
                           @RequestParam("id") String id) {
        System.out.println("=============查看用户详情=====================");

        User user = userService.getUserById(Integer.parseInt(id));
        //判断编号是否存在，不存在就不跳转
        if(user != null){
            map.put("userInfo",user);
        }
        //调用业务 根据编号查询用户详情
        return "userview";

    }

    //获取用户数据 跳转到修改用户数据页面
    @RequestMapping("/toUserMod")
    public String toUserMod(Map<String,Object> map,
                          @RequestParam("id") String id) {
        System.out.println("=============获取用户数据 跳转到修改用户数据页面=====================");

        User user = userService.getUserById(Integer.parseInt(id));

        //调用业务 根据编号查询用户详情
        //判断编号是否存在，不存在就不跳转
        if(user != null){
            map.put("userInfo",user);

            System.out.println("获取的用户信息==》"+JSON.toJSONStringWithDateFormat(user,"yyyy-MM-dd"));
            //转发到用户修改页面
            return "usermodify";
        }

        return "redirect:userList";

    }

    //修改用户信息
    @RequestMapping("/userMod")
    public String userMod(HttpServletRequest req,User userForm){
        System.out.println("=============修改用户信息=====================");
        // 获取修改用户详情的参数
        userForm.setModifyBy((Integer) req.getSession().getAttribute("userId"));

        // 调用业务接口，修改用户详情
        if(userService.modUserInfo(userForm)){
            System.out.println(userForm.getUserName()+"用户信息修改成功！！！");

            //如果当前用户修改本人信息
            //需改成功需要更新 session中的 loginUser
            if(((User)(req.getSession().getAttribute("loginUser"))).getId() == userForm.getId()){
                req.getSession().setAttribute("loginUser",userService.getUserById(userForm.getId()));
            }

        }else{
            System.out.println(userForm.getUserName()+"用户信息修改失败！！！");
        }

        //内部重定向 重新查询用户列表
        return "redirect:userList";

    }

    //根据用户id删除用户信息
    @RequestMapping("/userDel")
    public String userDel(@RequestParam("id") String id) throws IOException {
        System.out.println("=============删除用户信息=====================");
        Integer userId = Integer.parseInt(id);

        //调用业务层 删除用户信息
        if(userService.delUserById(userId)){
            System.out.println("删除id为"+userId+"的用户信息成功！！！");
        }else {
            System.out.println("删除id为"+userId+"的用户信息失败！！！");
        }

        //内部重定向 重新查询用户列表
        return "redirect:userList";

    }

    //跳转到添加用户信息
    @RequestMapping("/toUserAdd")
    public String toUserAdd(){
        System.out.println("=============跳转到添加用户信息=====================");

        // 跳转到 添加用户信息
        return "useradd";
    }


    //添加用户信息
    @RequestMapping("/userAdd")
    public String userAdd(HttpServletRequest req, User userForm){
        System.out.println("=============添加用户信息=====================");
        // 获取添加用户详情的参数
        userForm.setCreatedBy((Integer) req.getSession().getAttribute("userId"));

        // 调用业务接口，添加用户详情
        if(userService.addUserInfo(userForm)){
            System.out.println(userForm.getUserName()+"用户信息添加成功！！！");
        }else {
            System.out.println(userForm.getUserName()+"用户信息添加失败！！！");
        }

        //内部重定向 重新查询用户列表
        return "redirect:userList";

    }

    //跳转到添加用户信息
    @RequestMapping("/toUserPasswordMod")
    public String toUserPasswordMod(){
        System.out.println("=============跳转到修改用户密码=====================");

        // 跳转到 添加用户信息
        return "pwdmodify";

    }

    //修改用户密码
    @RequestMapping("/userPasswordMod")
    public String userPasswordMod(HttpServletRequest req,
                                @RequestParam("newpassword") String newpassword) {
        System.out.println("=============修改用户密码=====================");

        //获取用户请求参数
        //从session中获取用户的id
        Integer userId = ((User)req.getSession().getAttribute("loginUser")).getId();

        //调用业务层，修改密码
        if(userService.userPasswordMod(userId,newpassword)){
            System.out.println("id为"+userId+"的用户密码修改成功！！！");

            //应为每次修改密码从session中取出上次的旧密码来判断，所以需要再更行用户密码后，重置 loginUser
            req.getSession().setAttribute("loginUser",userService.getUserById(userId));
        }else {
            System.out.println("id为"+userId+"的用户密码修改失败！！！");
        }

        //内部重定向 重新查询用户列表
        return "redirect:userList";

    }

    //根据用户编码查看用户邮箱是否存在
    @RequestMapping("/checkUserCodeExist")
    @ResponseBody
    public boolean checkUserCodeExist(HttpServletRequest req,
                                      @RequestParam("userCode") String userCode) {
        System.out.println("=============根据用户编码查看用户邮箱是否存在=====================");
        //调用业务层查看用户邮箱是否存在
        User emailLoginUser = userService.getUserByUserCode(userCode);

        if(emailLoginUser != null && emailLoginUser.getUserEmail() != null){
            //如果用户存在
            System.out.println(userCode+"用户邮箱为===》userEmail="+emailLoginUser.getUserEmail());
            //将用户存入session域中，当邮箱登录成功之后，用emailLoginUser 替换  loginUser
            req.getSession().setAttribute("emailLoginUser",emailLoginUser);

            return true;
        }else{
            System.out.println(userCode+"用户没有开启邮箱登录！！！");
            return false;
        }
    }

    //发送验证码
    @RequestMapping("/sendEmail")
    @ResponseBody
    public boolean sendEmail(HttpServletRequest req) {
        System.out.println("=============发送验证码=====================");
        //获取 session中的 emailLoginUser
        User emailLoginUser = (User)req.getSession().getAttribute("emailLoginUser");
        //发送验证码
        //随机生成6位 验证码
        String emailCode = "143233";
        System.out.println("验证码==》"+emailCode);

        //多线程  异步发送
        new Sendmail(emailLoginUser.getUserEmail(),emailCode).start();

        //并将验证码存到session中，方便验证
        req.getSession().setAttribute("emailCode",emailCode);

        return true;

    }

    //判断用户验证码是否正确
    @RequestMapping("/emailLogin")
    @ResponseBody
    public boolean emailLogin(HttpServletRequest req, HttpServletResponse resp) throws  IOException {
        System.out.println("=============判断用户验证码是否正确 emailLogin =====================");
        //获取用户 输入的验证码
        String checkCode = req.getParameter("checkCode");

        //获取session中  发送给用户的验证码
        String emailCode = (String) req.getSession().getAttribute("emailCode");

        //判断验证码是否正确
        //获取 session中的 emailLoginUser
        User emailLoginUser = (User)req.getSession().getAttribute("emailLoginUser");
        if(checkCode.equals(emailCode)){
            //登录成功
            //用 emailLoginUser 替换session 中的  loginUser
            req.getSession().setAttribute("loginUser",emailLoginUser);
            System.out.println(emailLoginUser.getUserCode()+"用户邮箱验证登录成功！！！");
            return true;
        }else {
            System.out.println(emailLoginUser.getUserCode()+"用户邮箱验证登录失败！！！");
            return false;
        }

    }

    //跳转到登录陈工页面
    @RequestMapping("/toFrame")
    public String toFrame(){
        System.out.println("=============跳转到修改用户密码=====================");

        // 跳转到 添加用户信息
        return "frame";

    }



}
